package com.jxx.controller;

import com.jxx.pojo.Admin;
import com.jxx.pojo.AdminInfo;
import com.jxx.pojo.AdminSecurity;
import com.jxx.service.AdminService;
import com.jxx.util.AdminThreadLocal;
import com.jxx.util.ObjectMapperUtil;
import com.jxx.util.ShiroUtils;
import com.jxx.vo.SysResult;
import com.jxx.vo.UpdatePassword;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.JedisCluster;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.List;

@RestController
@RequestMapping("/admin/")
@Slf4j
public class AdminController {
    @Autowired
    private AdminService adminService;

    @Autowired
    private JedisCluster jedisCluster;


    /**
     * @author Zcc
     * @desc 使用shiro框架实现登录拦截
     * @param   adminAccount,adminPassword
     * @return SysResult
     * @date 2020年11月17日19:54:41
     */

    @RequestMapping("login")
    public SysResult login(String adminAccount,String adminPassword){
        //获取当前的用户
        Subject subject = SecurityUtils.getSubject();
        //封装用户的登录数据
        UsernamePasswordToken token = new UsernamePasswordToken(adminAccount, adminPassword);
        try {
            if (adminAccount.isEmpty()){
                return SysResult.fail("用户名不能为空");
            }else if (adminPassword.isEmpty()){
                return SysResult.fail("请输入密码!!");
            }else {
                subject.login(token);//执行登录方法,如果没有异常就说明ok了
                return SysResult.success();
            }
        } catch (UnknownAccountException e){//用户名不存在
            return SysResult.fail("账号不存在");
        } catch(IncorrectCredentialsException e) {//密码错误
            return SysResult.fail("密码错误");
        }
    }
    /**
     * @author Zcc
     * @desc 回显账号名
     * @param   request
     * @return Admin
     * @date 2020年11月17日19:54:41
     */
    @RequestMapping("showName")
    public Admin showName(HttpServletRequest request){
        Admin admin = ShiroUtils.getUser();
        admin.setAdminPassword("********");
        return admin;
    }
    /**
     * @author Zcc
     * @desc 退出登录
     * @param   request
     * @return SysResult
     * @date 2020年11月17日19:54:41
     */
    @RequestMapping("logout")
    public SysResult logout(HttpServletRequest request){
        Subject currentUser = SecurityUtils.getSubject();
        currentUser.logout();
//        Admin admin = (Admin) request.getSession().getAttribute("admin");
//        if (admin==null){
//            return SysResult.fail();
//        }else {
//            Enumeration em = request.getSession().getAttributeNames();
//            while(em.hasMoreElements()){
//                request.getSession().removeAttribute(em.nextElement().toString());
//            }
//            return SysResult.success();
//        }
        return SysResult.success();
    }
    /**
     * @author Zcc
     * @desc 管理员信息
     * @param   adminId
     * @return AdminInfo
     * @date 2020年11月21日20:33:54
     */
    @RequestMapping("showInfo")
    public AdminInfo showInfo(Integer adminId){
        AdminInfo adminInfo = adminService.showInfo(adminId);
        return adminInfo;
    }
    /**
     * @author Zcc
     * @desc 修改管理员信息
     * @param   adminInfo
     * @return SysResult
     * @date 2020年11月21日20:33:54
     */
    @RequestMapping("updateInfo")
    public SysResult updateInfo(@RequestBody AdminInfo adminInfo){

        return adminService.updateInfo(adminInfo);
    }
    /**
     * @author Zcc
     * @desc 展示管理员密保问题
     * @param   adminId
     * @return List<AdminSecurity>
     * @date 2020年11月21日20:33:54
     */
    @RequestMapping("showSecurityQuestion")
    public List<AdminSecurity> showSecurityQuestion(Integer adminId){
        return adminService.showSecurityQuestion(adminId);
    }
    /**
     * @author Zcc
     * @desc 判断密码
     * @param   adminAccount,adminPassword
     * @return SysResult
     * @date 2020年11月21日20:33:54
     */
    @RequestMapping("getPassword")
    public SysResult getPassword(String adminAccount,String adminPassword){
        return adminService.getPassword(adminAccount,adminPassword);
    }
    /**
     * @author Zcc
     * @desc 修改密码
     * @param   updatePassword,request
     * @return SysResult
     * @date 2020年11月21日20:33:54
     */
    @RequestMapping("updatePassword")
    public SysResult updatePassword(@RequestBody UpdatePassword updatePassword,
                                    HttpServletRequest request){
        return adminService.updatePassword(updatePassword,request);
    }

}